<div id="maincontent">

<h1>ECMAScript Boolean 运算符</h1>

<div id="tpn">

</div>


<div>
<p><strong>Boolean 运算符非常重要，它使得程序语言得以正常运行。</strong></p>
<p><strong>Boolean 运算符有三种：NOT、AND 和 OR。</strong></p>
</div>


<div>
<h2>ToBoolean 操作</h2>

<p>在学习各种逻辑运算符之前，让我们先了解一下 ECMAScript-262 v5 规范中描述的 ToBoolean 操作。</p>

<p>抽象操作 ToBoolean 将其参数按照下表中的规则转换为逻辑值：</p>

<table class="dataintable">
<tr>
<th>参数类型</th>
<th>结果</th>
</tr>

<tr>
<td>Undefined</td>
<td>false</td>
</tr>

<tr>
<td>Null</td>
<td>false</td>


<tr>
<td>Boolean</td>
<td>结果等于输入的参数（不转换）</td>
</tr>

<tr>
<td>Number</td>
<td>如果参数为 +0, -0 或 NaN，则结果为 false；否则为 true。</td>
</tr>

<tr>
<td>String</td>
<td>如果参数为空字符串，则结果为 false；否则为 true。</td>
</tr>

<tr>
<td>Object</td>
<td>true</td>
</tr>
</table>
</div>


<div>
<h2>逻辑 NOT 运算符</h2>

<p>在 ECMAScript 中，逻辑 NOT 运算符与 C 和 Java 中的逻辑 NOT 运算符相同，都由感叹号（!）表示。</p>

<p>与逻辑 OR 和逻辑 AND 运算符不同的是，<strong>逻辑 NOT 运算符返回的一定是 Boolean 值</strong>。</p>

<p>逻辑 NOT 运算符的行为如下：</p>

<ul>
<li>如果运算数是对象，返回 false</li>
<li>如果运算数是数字 0，返回 true</li>
<li>如果运算数是 0 以外的任何数字，返回 false</li>
<li>如果运算数是 null，返回 true</li>
<li>如果运算数是 NaN，返回 true</li>
<li>如果运算数是 undefined，发生错误</li>
</ul>

<p>通常，该运算符用于控制循环：</p>

<pre>
var bFound = false;
var i = 0;

<code>while (!bFound)</code> {
  if (aValue[i] == vSearchValues) {
    bFound = true;
  } else {
    i++;
  }
}
</pre>

<p>在这个例子中，Boolean 变量（bFound）用于记录检索是否成功。找到问题中的数据项时，bFound 将被设置为 true，!bFound 将等于 false，意味着运行将跳出 while 循环。</p>

<p>判断 ECMAScript 变量的 Boolean 值时，也可以使用逻辑 NOT 运算符。这样做需要在一行代码中使用两个 NOT 运算符。无论运算数是什么类型，第一个 NOT 运算符返回 Boolean 值。第二个 NOT 将对该 Boolean 值求负，从而给出变量真正的 Boolean 值。</p>

<pre>
var bFalse = false;
var sRed = &quot;red&quot;;
var iZero = 0;
var iThreeFourFive = 345;
var oObject = new Object;

document.write(&quot;bFalse 的逻辑值是 &quot; + (!!bFalse));
document.write(&quot;sRed 的逻辑值是 &quot; + (!!sRed));
document.write(&quot;iZero 的逻辑值是 &quot; + (!!iZero));
document.write(&quot;iThreeFourFive 的逻辑值是 &quot; + (!!iThreeFourFive));
document.write(&quot;oObject 的逻辑值是 &quot; + (!!oObject));
</pre>

<p>结果：</p>

<pre>
bFalse 的逻辑值是 false
sRed 的逻辑值是 true
iZero 的逻辑值是 false
iThreeFourFive 的逻辑值是 true
oObject 的逻辑值是 true 
</pre>
</div>


<div>
<h2>逻辑 AND 运算符</h2>

<p>在 ECMAScript 中，逻辑 AND 运算符用双和号（&amp;&amp;）表示：</p>

<p>例如：</p>

<pre>
var bTrue = true;
var bFalse = false;
var bResult = bTrue &amp;&amp; bFalse;
</pre>

<p>下面的真值表描述了逻辑 AND 运算符的行为：</p>

<table class="dataintable">
<tr>
<th>运算数 1</th>
<th>运算数 2</th>
<th>结果</th>
</tr>

<tr>
<td>true</td>
<td>true</td>
<td>true</td>
</tr>

<tr>
<td>true</td>
<td>false</td>
<td>false</td>
</tr>

<tr>
<td>false</td>
<td>true</td>
<td>false</td>
</tr>

<tr>
<td>false</td>
<td>false</td>
<td>false</td>
</tr>
</table>

<p><strong>逻辑 AND 运算的运算数可以是任何类型的，不止是 Boolean 值。</strong></p>

<p>如果某个运算数不是原始的 Boolean 型值，逻辑 AND 运算并不一定返回 Boolean 值：</p>

<ul>
<li>如果一个运算数是对象，另一个是 Boolean 值，返回该对象。</li>
<li>如果两个运算数都是对象，返回第二个对象。</li>
<li>如果某个运算数是 null，返回 null。</li>
<li>如果某个运算数是 NaN，返回 NaN。</li>
<li>如果某个运算数是 undefined，发生错误。</li>
</ul>

<p>与 Java 中的逻辑 AND 运算相似，ECMAScript 中的逻辑 AND 运算也是简便运算，即如果第一个运算数决定了结果，就不再计算第二个运算数。对于逻辑 AND 运算来说，如果第一个运算数是 false，那么无论第二个运算数的值是什么，结果都不可能等于 true。</p>

<p>考虑下面的例子：</p>

<pre>
var bTrue = true;
var bResult = (bTrue &amp;&amp; bUnknown);	<span>//发生错误</span>
alert(bResult);			<span>//这一行不会执行</span>
</pre>

<p>这段代码在进行逻辑 AND 运算时将引发错误，因为变量 bUnknown 是未定义的。变量 bTrue 的值为 true，因为逻辑 AND 运算将继续计算变量 bUnknown。这样做就会引发错误，因为 bUnknown 的值是 undefined，不能用于逻辑 AND 运算。</p>

<p>如果修改这个例子，把第一个数设为 false，那么就不会发生错误：</p>

<pre>
var bFalse = false;
var bResult = (bFalse &amp;&amp; bUnknown);
alert(bResult);			<span>//输出 &quot;false&quot;</span>
</pre>

<p>在这段代码中，脚本将输出逻辑 AND 运算返回的值，即字符串 &quot;false&quot;。即使变量 bUnknown 的值为 undefined，它也不会被计算，因为第一个运算数的值是 false。</p>

<p class="tip"><span>提示：</span>在使用逻辑 AND 运算符时，必须记住它的这种简便计算特性。</p>
</div>


<div>
<h2>逻辑 OR 运算符</h2>

<p>ECMAScript 中的逻辑 OR 运算符与 Java 中的相同，都由双竖线（||）表示：</p>

<pre>
var bTrue = true;
var bFalse = false;
var bResult = bTrue || bFalse;
</pre>

<p>下面的真值表描述了逻辑 OR 运算符的行为：</p>

<table class="dataintable">
<tr>
<th>运算数 1</th>
<th>运算数 2</th>
<th>结果</th>
</tr>

<tr>
<td>true</td>
<td>true</td>
<td>true</td>
</tr>

<tr>
<td>true</td>
<td>false</td>
<td>true</td>
</tr>

<tr>
<td>false</td>
<td>true</td>
<td>true</td>
</tr>

<tr>
<td>false</td>
<td>false</td>
<td>false</td>
</tr>
</table>

<p>与逻辑 AND 运算符相似，如果某个运算数不是 Boolean 值，逻辑 OR 运算并不一定返回 Boolean 值：</p>

<ul>
<li>如果一个运算数是对象，并且该对象左边的运算数值均为 false，则返回该对象。</li>
<li>如果两个运算数都是对象，返回第一个对象。</li>
<li>如果最后一个运算数是 null，并且其他运算数值均为 false，则返回 null。</li>
<li>如果最后一个运算数是 NaN，并且其他运算数值均为 false，则返回 NaN。</li>
<li>如果某个运算数是 undefined，发生错误。</li>
</ul>

<p>与逻辑 AND 运算符一样，逻辑 OR 运算也是简便运算。对于逻辑 OR 运算符来说，如果第一个运算数值为 true，就不再计算第二个运算数。</p>

<p>例如：</p>

<pre>
var bTrue = true;
var bResult = (bTrue || bUnknown);
alert(bResult);			<span>//输出 &quot;true&quot;</span>
</pre>

<p>与前面的例子相同，变量 bUnknown 是未定义的。不过，由于变量 bTrue 的值为 true，bUnknown 不会被计算，因此输出的是 &quot;true&quot;。</p>

<p>如果把 bTrue 改为 false，将发生错误：</p>

<pre>
var bFalse = false;
var bResult = (bFalse || bUnknown);	<span>//发生错误</span>
alert(bResult);			<span>//不会执行这一行</span>
</pre>
</div>


<div id="bpn">

</div>




</div>
